package com.xsomnus.java_basic.juc.queue;


import java.util.ArrayDeque;
import java.util.Deque;
import java.util.concurrent.*;

/**
 * @author @xsomnus666_xiawenye★
 * @since 2019/7/19 0019 11:47
 * - 才需学也,学需静也/非淡泊无以明志，非宁静无以致远
 * https://juejin.im/post/5bcece9be51d457a765bce28#heading-1
 */
public class ConcurrentQueues {

    /**
     * 底层使用的是静态数组，所以该队列是有大小的
     */
    private static ArrayBlockingQueue<Object> arrayBlockingQueue = new ArrayBlockingQueue<>(32, false);

    /**
     * 由于底层使用的是链表，就是动态的数据结构，无界队列
     */
    private static LinkedBlockingQueue<Object> linkedBlockingQueue = new LinkedBlockingQueue<>();

    /**
     * 优先队列
     * 底层使用的是堆的数据结构
     */
    private static PriorityBlockingQueue<Object> priorityBlockingQueue = new PriorityBlockingQueue<>();

    /**
     * 延时队列，底层使用的是 PriorityQueue
     * 而PriorityQueue底层使用的数据结构是 堆
     * DelayQueue非常有用，可以运用在以下两个应用场景： 
     * <p>
     * 缓存系统的设计：使用DelayQueue保存缓存元素的有效期，使用一个线程循环查询DelayQueue，一旦能从DelayQueue中获取元素时，就表示有缓存到期了。 
     * 定时任务调度：使用DelayQueue保存当天要执行的任务和执行时间，一旦从DelayQueue中获取到任务就开始执行，比如Timer就是使用DelayQueue实现的。
     */
    private static DelayQueue delayQueue = new DelayQueue();


    private static SynchronousQueue synchronousQueue = new SynchronousQueue();

    /**
     * 双端队列
     */
    private static Deque<SayHello> deque = new ArrayDeque<>();

    public static void main(String[] args) throws InterruptedException {

        deque.add(new SayHello("jack"));
        deque.add(new SayHello("jack"));
        deque.add(new SayHello("jack"));
        deque.add(new SayHello("jack"));

        System.out.println(deque.size());


        synchronousQueue.add(new SayHello("tom"));

        System.out.println(synchronousQueue.size());

    }
}
